// 创建用户相关的小仓库
import { defineStore } from 'pinia';

// 引入接口
import { reqLogin, reqLogout, reqUserInfo } from '@/api/user';

// 引入数据类型
import type { loginFormData, loginResponseData, userInfoResponseData } from '@/api/user/type';
import type { UserState } from './type/type';

// 引入操作本地存储的工具方法
import { SET_TOKEN, GET_TOKEN, REMOVE_TOKEN } from '@/utils/token';

// 引入路由（常量路由）
import { constantRoute } from '@/router/routes'

let useUserStore = defineStore('User', {
    state: (): UserState => {
        return {
            token: GET_TOKEN(), // 用户唯一标识token
            menuRoutes: constantRoute,//路由
            username: '未登录',
            avatar: '',
        }
    },
    // 异步|逻辑的地方
    actions: {
        // 用户登录的方法
        async userLogin(data: loginFormData) {
            console.log('登录数据：', data, 'userLogin')
            // 1.调用登录接口
            let res: loginResponseData = await reqLogin(data);
            console.log('登录中：', res.code)
            // 登录成功：200->token
            if (res.code == 0) {
                console.log('登录成功：', res.code)
                // pinia仓库存储一下token
                // 由于pinia|vuex存储数据其实利用js对象
                this.token = (res.result.token as string);
                this.username = data.username;
                // 本地存储持久化存储一份
                console.log('SET_TOKEN', res.result.token)
                SET_TOKEN((res.result.token as string))
                return 'ok';
            } else {
                // 登录失败：201->登录失败的错误信息
                console.log('登录失败：', res)
                return Promise.reject(new Error(res.message || '登录失败'))
            }
        },
        // 
        async userInfo() {
            console.log('获取用户的信息')
            let result: any = await reqUserInfo();
            console.log('获取用户的信息pinia', result)
            if (result.id) {
                console.log('获取用户的信息----------成功')
                this.username = result.username;
                this.avatar = result.avatar;
                return 'ok'
            } else {
                console.log('获取用户的信息----------失败')
                return Promise.reject(new Error(result.message))
            }
        },
        // 退出登录
        async userLogout() {
            let result: any = await reqLogout();
            console.log(result, '退出登录')
            if (result.code == 200) {
                this.token = '';
                this.username = '未登录';
                this.avatar = '';
                REMOVE_TOKEN()
                return 'ok'
            } else {
                return Promise.reject(new Error(result.message))
            }

        }
    },
    getters: {}
})

export default useUserStore;